AWS LambdaのLambda拡張機能を使ってParameter Storeの値を取得する(AWS SAM)
お手軽でした。特にキャッシュ機能を活用したい場合におすすめです。自前実装の必要がありません。
2024.09.02
AWS Lambdaには拡張機能(Lambda Extension)があります。
この中にAWS Systems Managerのパラメータストアを利用できる拡張機能があります。今回はAWS SAMを利用して試してみました。
おすすめの方
- AWS LambdaのLambda拡張機能を使ってParameter Storeの値を取得したい方
- AWS SAMでLambda拡張機能を試してみたい方
AWS Systems Managerのパラメータストアにデータを追加する
aws ssm put-parameter \
--name "/Blog/Sample/TEST/message" \
--type "String" \
--value "this is test message" \
--overwrite
aws ssm put-parameter \
--name "/Blog/Sample/TEST/hello" \
--type "String" \
--value "world" \
--overwrite
aws ssm put-parameter \
--name "/Blog/Sample/TEST/secret" \
--type "SecureString" \
--value "this is secure string message" \
--overwrite
Lambdaをデプロイする
sam init
sam init \
--runtime python3.11 \
--name lambda-extensions-ssm-parameter-store-sample \
--app-template hello-world \
--no-tracing \
--no-application-insights \
--structured-logging \
--package-type Zip
テンプレートファイル
Lambda ExtensionsのARNや設定用の環境変数は、下記を参照してください。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-extensions-ssm-parameter-store-sample
Globals:
Function:
Timeout: 5
LoggingConfig:
LogFormat: JSON
Parameters:
LambdaExtensionSsmLayerArn:
Type: String
Default: "arn:aws:lambda:ap-northeast-1:133490724326:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11"
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.11
Architectures:
- x86_64
Policies:
- arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
Layers:
- !Ref LambdaExtensionSsmLayerArn
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
HelloWorldFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
Outputs:
HelloWorldApi:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
Lambdaコード
パラメータストアのNameを指定します。なお、階層構造にして「xxx配下のすべてを取得」はできませんでした。400が返ってきます。
app.py
import os
import json
import requests
import urllib.parse
LAMBDA_EXTENSIONS_SSM_BASE_URL = "http://localhost:2773/systemsmanager/parameters/get"
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps(
{
"message": get_parameter("/Blog/Sample/TEST/message"),
"hello": get_parameter("/Blog/Sample/TEST/hello"),
"secret": get_parameter("/Blog/Sample/TEST/secret", True),
},
),
}
def get_parameter(name: str, is_secure: bool = False) -> str:
headers = {
"X-Aws-Parameters-Secrets-Token": os.environ.get("AWS_SESSION_TOKEN"),
}
url = f"{LAMBDA_EXTENSIONS_SSM_BASE_URL}?name={urllib.parse.quote(name)}"
if is_secure:
url += "&withDecryption=true"
resp = requests.get(url, headers=headers)
if resp.status_code != 200:
raise ValueError(f"Failed to get parameter: {name}")
return resp.json()["Parameter"]["Value"]
デプロイ
sam build
sam deploy \
--guided \
--region ap-northeast-1 \
--stack-name lambda-extensions-ssm-parameter-store-sample-stack
動作を確認する
問題なく取得できました。
$ curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
{
"message": "this is test message",
"hello": "world",
"secret": "this is secure string message"
}
さいごに
お手軽でした。特にキャッシュ機能を活用したい場合におすすめです。自前実装の必要がありません。
参考
- Lambda 拡張機能を使用して Lambda 関数を補強する - AWS Lambda
- AWS Lambda 拡張機能パートナー - AWS Lambda
- AWS Lambda 関数での Parameter Store パラメーターの使用 - AWS Systems Manager
- aws-samples/aws-lambda-extensions: A collection of sample extensions to help you get started with AWS Lambda Extensions
- AWS Parameters and Secrets Lambda Extension の環境変数
- AWS Parameters and Secrets Lambda Extension の ARN
- [アップデート] Lambdaから直接Parameter Store/Secrets Managerから値を取得できるようになりました! | DevelopersIO
- AWS Parameters and Secrets Lambda Extension で特定の階層のパラメータをすべて取得することはできますか? | DevelopersIO